package LeetCode1;

/**
 * 有效的数独
 * @author 是阿秋啊
 * @date 2022/03/26 20:31
 **/
public class Num36 {
    public boolean isValidSudoku(char[][] board) {
        int[][] row = new int[9][10];// 哈希表存储每一行的每个数是否出现过，默认初始情况下，每一行每一个数都没有出现过
        // 整个board有9行，第二维的维数10是为了让下标有9，和数独中的数字9对应。
        int[][] col = new int[9][10];// 存储每一列的每个数是否出现过，默认初始情况下，每一列的每一个数都没有出现过
        int[][][] box = new int[3][3][10];//存储每个小框里出现的数字
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                // 遍历到第i行第j列的那个数,我们要判断这个数在其所在的行有没有出现过，
                // 同时判断这个数在其所在的列有没有出现过
                // 同时判断这个数在其所在的box中有没有出现过
                char c = board[i][j];
                if (c != '.') {
                    int num = c - '0';
                    row[i][num]++;
                    col[j][num]++;
                    box[i/3][j/3][num]++;
                    if (row[i][num] > 1 || col[j][num] > 1 || box[i/3][j/3][num] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
}
